package tests;


import java.util.HashSet;
import java.util.Set;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import business.Aluno;
import business.AreaCientifica;
import business.Disciplina;
import business.Inscricao;
import business.Oferta;
import business.Perfil;
import business.Professor;

public class DisciplinaTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}
	
	@Test
	public void constructValid(){
		Disciplina precedente = new Disciplina();
		precedente.setNome("ESI");
		
		Set precedentes = new HashSet<Disciplina>();
		precedentes.add(precedente);
		
		AreaCientifica ac = new AreaCientifica();
		ac.setNome("Tec");
		Professor p = new Professor();
		p.setNome("prof");
		
		Set<Professor> ed = new HashSet<Professor>();
		ed.add(p);
		Disciplina a = new Disciplina("ESII", precedentes, ac, p, ed); 
	}
	
//	@Test
//	public void constructInvalidName(){
//		Disciplina precedente = new Disciplina();
//		precedente.setNome("ESI");
//		
//		Set precedentes = new HashSet<Disciplina>();
//		precedentes.add(precedente);
//		
//		AreaCientifica ac = new AreaCientifica();
//		ac.setNome("Tec");
//		Professor p = new Professor();
//		p.setNome("prof");
//		
//		Set<Professor> ed = new HashSet<Professor>();
//		ed.add(p);
//		Disciplina a = new Disciplina(null, precedentes, ac, p, ed); 
//	}
//	
//	@Test
//	public void constructInvalidPrec(){
//		
//		AreaCientifica ac = new AreaCientifica();
//		ac.setNome("Tec");
//		Professor p = new Professor();
//		p.setNome("prof");
//		
//		Set<Professor> ed = new HashSet<Professor>();
//		ed.add(p);
//		Disciplina a = new Disciplina("ESII", null, ac, p, ed); 
//	}
//	
//	@Test
//	public void constructInvalidAC(){
//		Disciplina precedente = new Disciplina();
//		precedente.setNome("ESI");
//		
//		Set precedentes = new HashSet<Disciplina>();
//		precedentes.add(precedente);
//		
//		Professor p = new Professor();
//		p.setNome("prof");
//		
//		Set<Professor> ed = new HashSet<Professor>();
//		ed.add(p);
//		Disciplina a = new Disciplina("ESII", precedentes, null, p, ed); 
//	}
//	
//	@Test
//	public void constructInvalidProf(){
//		Disciplina precedente = new Disciplina();
//		precedente.setNome("ESI");
//		
//		Set precedentes = new HashSet<Disciplina>();
//		precedentes.add(precedente);
//		
//		AreaCientifica ac = new AreaCientifica();
//		ac.setNome("Tec");
//		Professor p = new Professor();
//		p.setNome("prof");
//		
//		Set<Professor> ed = new HashSet<Professor>();
//		ed.add(p);
//		Disciplina a = new Disciplina("ESII", precedentes, ac, null, ed); 
//	}
//	
//	@Test
//	public void constructInvalidEd(){
//		Disciplina precedente = new Disciplina();
//		precedente.setNome("ESI");
//		
//		Set precedentes = new HashSet<Disciplina>();
//		precedentes.add(precedente);
//		
//		AreaCientifica ac = new AreaCientifica();
//		ac.setNome("Tec");
//		Professor p = new Professor();
//		p.setNome("prof");
//		
//		Set<Professor> ed = new HashSet<Professor>();
//		ed.add(p);
//		Disciplina a = new Disciplina("ESII", precedentes, ac, p, null); 
//	}
//	
	@Test (expected=AssertionError.class)
	public void constructAssertionTest1(){
		//case one: all invalid
		Disciplina a = new Disciplina(null, null, null, null, null); 
	}
	
//	@Test (expected=AssertionError.class)
//	public void constructAssertionTest2(){
//		Set<Disciplina> d = new HashSet<Disciplina>();
//		Set<Professor> p = new HashSet<Professor>();
//		Disciplina es2 = new Disciplina();
//		
//	}
	
	
	@Test
	public void ValidSetName(){
		Disciplina a = new Disciplina();
		a.setNome("ESII");
	}
	
	@Test (expected=AssertionError.class)
	public void InvalidSetName(){
		Disciplina a = new Disciplina(); 
		a.setNome(null);
	}
	
	@Test
	public void ValidSetAC(){
		Disciplina a = new Disciplina(); 
		a.setAreaCientifica(new AreaCientifica());
	}
	
	@Test (expected=AssertionError.class)
	public void InvalidSetAC(){
		Disciplina a = new Disciplina();
		a.setAreaCientifica(null);
	}
	
	@Test
	public void ValidSetProf(){
		Disciplina a = new Disciplina(); 
		a.setRegente(new Professor());
	}
	
	@Test (expected=AssertionError.class)
	public void InvalidSetProf(){
		Disciplina a = new Disciplina();
		a.setRegente(null);
	}
	
	@Test
	public void ValidAddEquipaDocente(){
		Professor p = new Professor();
		Disciplina a = new Disciplina();
		a.addEquipaDocente(p);
	}
	
	@Test (expected=AssertionError.class)
	public void InvalidAddEquipaDocente(){
		Disciplina a = new Disciplina();
		a.addEquipaDocente(null);
	}
	
	@Test
	public void ValidAddPrec(){
		Disciplina a = new Disciplina();
		a.addPrecedentes(new Disciplina());
	}
	
	@Test (expected=AssertionError.class)
	public void InvalidAddPrec(){
		Disciplina a = new Disciplina();
		a.addPrecedentes(null);
	}
	
	@Test
	public void inscricoesTester(){
		Inscricao i = new Inscricao();
		Disciplina d = new Disciplina();
		i.setDisciplina(d);
		d.inscricoes();
	}
	
	@Test
	public void alunosTester(){
		Inscricao i = new Inscricao();
		Disciplina d = new Disciplina();
		Aluno a = new Aluno();
		i.setAluno(a);
		i.setDisciplina(d);
		
		d.alunos();
		
	}
	
	@Test
	public void ofertasTester(){
		
		Oferta o = new Oferta();
		Disciplina d = new Disciplina();
		o.setDisciplina(d);
		d.ofertas();
	}
	
	@Test
	public void objectosTester(){
		Disciplina.objectos();
	}
	
	@Test
	public void resetTester(){
		Disciplina.reset();
	}
	
	@Test
	public void perfisTester(){
		Oferta o = new Oferta();
		Perfil p = new Perfil();
		Disciplina d = new Disciplina();
		o.setPerfil(p);
		o.setDisciplina(d);
		
		d.perfis();
		
	}
	
	@Test
	public void seguintesTester(){
		Disciplina es1 = new Disciplina();
		Disciplina es2 = new Disciplina();
		
		es2.addPrecedentes(es1);
		es1.seguintes();
	}
	
	@Test
	public void precedenteSeguinteTester(){
		Disciplina es1 = new Disciplina();
		Disciplina es2 = new Disciplina();
		es2.addPrecedentes(es1);
		es1.addPrecedentes(es2);
		es1.disciplinaPrecedenteSeguinte();
		
	}
	
	@Test
	public void getterTester(){
		Disciplina d = new Disciplina();
		d.getAreaCientifica();
		d.getClass();
		d.getEquipaDocente();
		d.getNome();
		d.getPrecedentes();
		d.getRegente();
		d.getSeguintes();
		
	}
	
	@Test
	public void precedenteSeguinteTester2(){
		Disciplina es1 = new Disciplina();
		Disciplina es2 = new Disciplina();
		es2.addPrecedentes(es1);
		es1.disciplinaPrecedenteSeguinte();
	}
	
	@Test
	public void efectuarInscricaoTester(){
		Disciplina d = new Disciplina();
		d.efectuaInscricao(new Aluno());
	}
	
	@Test
	public void toStringTester(){
		Professor p = new Professor();
		p.setNome("John Doe");
		
		AreaCientifica ac = new AreaCientifica();
		ac.setNome("ac1");
		
		Disciplina d = new Disciplina();
		
		d.setNome("es1");
		d.setAreaCientifica(ac);
		d.setRegente(p);
		
		d.toString();
	}
	

}
